/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import vista.ObtenerTeclado;
import persistencia.PersistenciaCliente;
import persistencia.PersistenciaAlquiler;



import java.util.*;
import java.util.ArrayList;

/**
 *
 * @author JAVA
 */
public class GestionCliente {

    /*
     * Busca una lista de Clientes que coincida con los datos que se le Introducen y la Representa
     * j=OpcionBusqueda   1=Nombre, 2=Apellidos, 3=Dni, 4=Id, 5=NombreUsuario
     */
    public static ArrayList<Cliente> buscaClientes(int j, String s) {

        ArrayList<Cliente> listaClientes = new ArrayList<Cliente>();
        System.out.println(" ");
        switch (j) {
            case 1:
                //método para seleccionar un cliente por el nombre
                listaClientes = PersistenciaCliente.seleccionaCliente(1, s);
                break;
            case 2:
                //método para seleccionar un cliente por el apellido
                listaClientes = PersistenciaCliente.seleccionaCliente(2, s);
                break;
            case 3:
                //método para seleccionar un cliente por el dni
                listaClientes = PersistenciaCliente.seleccionaCliente(3, s);
                break;
            case 4:
                //método para seleccionar un cliente por el id
                listaClientes = PersistenciaCliente.seleccionaCliente(4, s);
                break;
            case 5:
                //método para seleccionar un cliente por el nombre de usuario
                listaClientes = PersistenciaCliente.seleccionaCliente(5, s);
                break;
            default:
                System.out.println("\n Opcion incorrecta. ");
                break;

        }
        if (!listaClientes.isEmpty()) {
            System.out.println("   Id       Nombre      Apellidos         Pin    Apodo       Saldo");
            for (Cliente c : listaClientes) { //Recorre la Lista de Clientes y Representa
                String res = "   ";
                int idCliente = c.getId();
                String s1 = c.getNombre();
                String s2 = c.getApellidos();
                String s3 = String.valueOf(c.getPin());
                String s4 = c.getNomUsuario();
                String s5 = String.valueOf(c.getSaldo());

                res = res + idCliente;
                for (int q = res.length(); q < 12; q++) { //Espacio
                    res = res + " ";
                }
                res = res + s1;
                for (int q = res.length(); q < 24; q++) { //Espacio
                    res = res + " ";
                }
                res = res + s2;
                for (int q = res.length(); q < 42; q++) { //Espacio
                    res = res + " ";
                }
                res = res + s3;
                for (int q = res.length(); q < 49; q++) { //Espacio
                    res = res + " ";
                }
                res = res + s4;
                for (int q = res.length(); q < 61; q++) { //Espacio
                    res = res + " ";
                }
                res = res + s5;
                System.out.println(res);
            }
        }
        return listaClientes;

    }

    /*
     * Devuelve un Cliente a partir de una Lista de Clientes y un Id existente entre ellos
     */
    public static Cliente seleccionaCliente(ArrayList<Cliente> listaClientes, int id) {
        Cliente c = null;
        int j = id;
        while (j != 0) {
            if (!listaClientes.isEmpty()) {
                for (Cliente cliente : listaClientes) {
                    if (cliente.getId() == id) {
                        c = cliente;
                    }
                }
            }
            if (c != null) {
                j = 0;
            } else {
                id = ObtenerTeclado.dameEntero("Id Erroneo!! Introduce el Id del Cliente seleccionado de nuevo:");
            }
        }
        return c;
    }

    /*
     * Modifica el Saldo del Cliente que se le Introduce
     */
    public static void modificarSaldoCliente(Cliente c) {
        System.out.println("El Saldo actual del Cliente es: " + c.getSaldo());
        float f = ObtenerTeclado.dameFloat("Introduce la Cantidad para Incrementar o Disminuir el Saldo:");
        c.setSaldo(c.getSaldo() + f);
        System.out.println("Saldo nuevo: " + c.getSaldo());
        String saldo=((Float)c.getSaldo()).toString();
        PersistenciaCliente.modificaCliente(10, c, saldo);
    }
    /*
     * Modifica Otros Campos del Cliente que se le introduce
     * k=OpcionCampo    1=Nombre, 2=Apellidos, 3=Dni, 4=Domicilio, 5=Telefono, 6=Email, 7=Vip, 8=NombreUsuario, 9=Pin
     */
    public static void modificarOtrosDatosCliente(Cliente c, int k) {

        switch (k) {
            case 1:
                System.out.println(" ");
                System.out.println("  Nombre Actual: " + c.getNombre());
                String nombre = ObtenerTeclado.dameCadena("  Introduce el Nombre nuevo: ");
                PersistenciaCliente.modificaCliente(1, c, nombre);
                System.out.println("Nombre Cambiado!!");
                break;
            case 2:
                System.out.println(" ");
                System.out.println("  Apellidos Actuales: " + c.getApellidos());
                String apellidos = ObtenerTeclado.dameCadena("  Introduce los Apellidos nuevos: ");
                PersistenciaCliente.modificaCliente(2, c, apellidos);
                System.out.println("Apellidos Cambiados!!");
                break;
            case 3:
                System.out.println(" ");
                System.out.println("  Dni Actual: " + c.getDni());
                String dni = ObtenerTeclado.dameCadena("  Introduce el Dni nuevo: ");
                PersistenciaCliente.modificaCliente(3, c, dni);
                System.out.println("Dni Cambiado!!");
                break;
            case 4:
                System.out.println(" ");
                System.out.println("  Domicilio Actual: " + c.getDomicilio());
                String domicilio = ObtenerTeclado.dameCadena("  Introduce el Domicilio nuevo: ");
                PersistenciaCliente.modificaCliente(4, c, domicilio);
                System.out.println("Domicilio Cambiado!!");
                break;
            case 5:
                System.out.println(" ");
                System.out.println("  Teléfono Actual: " + c.getTelefono());
                String telefono = ObtenerTeclado.dameCadena("  Introduce el Teléfono nuevo: ");
                PersistenciaCliente.modificaCliente(5, c, telefono);
                System.out.println("Teléfono Cambiado!!");
                break;
            case 6:
                System.out.println(" ");
                System.out.println("  E-mail Actual: " + c.getEmail());
                String email = ObtenerTeclado.dameCadena("  Introduce el E-Mail nuevo: ");
                PersistenciaCliente.modificaCliente(6, c, email);
                System.out.println("E-mail Cambiado!!");
                break;
            case 7:
                System.out.println(" ");
                if (c.isVip()) {
                    System.out.println("  El Cliente es Vip");
                } else {
                    System.out.println("  El Cliente No es Vip");
                }
                int v = 0;
                do {
                    v = ObtenerTeclado.dameEntero("  Introduce nuevo Estado. ¿Vip? Si(1)/No(0)");
                } while (v!=1 && v!=0);
                
                if (v==1) {
                    int ii=PersistenciaCliente.modificaCliente(7, c, "true");
                    if(ii==1){
                        System.out.println("El Cliente ahora es Vip!!");
                    }else{
                        System.out.println("Error!: No se ha modificado el estado del Cliente!");
                    }
                } else {
                    int ii=PersistenciaCliente.modificaCliente(7, c, "false");
                    if(ii==1){
                        System.out.println("El Cliente ahora No es Vip!!");
                    }else{
                        System.out.println("Error!: No se ha modificado el estado del Cliente!");
                    }
                }
                break;
            case 8:
                System.out.println(" ");
                System.out.println("  Nombre de Usuario Actual: " + c.getNomUsuario());
                String nomUsuario = ObtenerTeclado.dameCadena("  Introduce el Nombre de Usuario nuevo: ");
                PersistenciaCliente.modificaCliente(8, c, nomUsuario);
                System.out.println("Nombre de Usuario Cambiado!!");
                break;
            case 9:
                System.out.println(" ");
                System.out.println("  Pin Actual: " + c.getPin());
                String pin = ObtenerTeclado.dameCadena("  Introduce el Pin nuevo: ");
                PersistenciaCliente.modificaCliente(9, c, pin);
                System.out.println("Pin Cambiado!!");
                break;
            default:
                System.out.println("\n Opcion incorrecta. ");
                break;
        }

    }
    /*
     * Representa datos del Cliente (Id,Nombre,Apellidos,Pin,NomUsuario,Saldo,Vip,AlquileresPendientes)
     */
    public static void mostrarDatosCliente(Cliente c) {
        List<Alquiler> lista = PersistenciaAlquiler.obtenerListaAlquileres(c);
        String res = "";
        System.out.println("Id     Nombre       Apellidos         Pin    Apodo        Saldo       Vip  Alq.Pendientes");

        int id = c.getId();
        String s1 = c.getNombre();
        String s2 = c.getApellidos();
        String s4 = c.getNomUsuario();
        String s3 = String.valueOf(c.getPin());
        String s5 = String.valueOf(c.getSaldo());
        String vip = "";
        String alq = "";
        if (c.isVip()) {
            vip = "Sí";
        } else {
            vip = "No";
        }
        if (lista.isEmpty()) {
            alq = "No";
        } else {
            alq = "Sí";
        }
        res = res + id;
        for (int q = res.length(); q < 7; q++) { //Espacio
            res = res + " ";
        }
        res = res + s1;
        for (int q = res.length(); q < 20; q++) { //Espacio
            res = res + " ";
        }
        res = res + s2;
        for (int q = res.length(); q < 38; q++) { //Espacio
            res = res + " ";
        }
        res = res + s3;
        for (int q = res.length(); q < 45; q++) { //Espacio
            res = res + " ";
        }
        res = res + s4;
        for (int q = res.length(); q < 58; q++) { //Espacio
            res = res + " ";
        }
        res = res + s5;
        for (int q = res.length(); q < 70; q++) { //Espacio
            res = res + " ";
        }
        res = res + vip;
        for (int q = res.length(); q < 75; q++) { //Espacio
            res = res + " ";
        }
        res = res + alq;
        System.out.println(res);
        int opcion = 0;
        if (!lista.isEmpty()) {
            opcion = ObtenerTeclado.dameEntero("Quieres ver los alquileres? Si(1)/No(0)");
        }

        if (opcion == 1) {
            GestionInformes.alquileresPendientes(lista, c);
        }
    }

    /*
     * Pregunta los Datos de un Cliente y lo Introduce en la Base de Datos si no existen Coincidencias
     */
    public static void altaCliente() {
        int k = 1;
        do {
            System.out.println(" ------ Menú Alta de Cliente ------ ");
            System.out.println("");
            String nombre = ObtenerTeclado.dameCadena("Introduce el Nombre: ");
            String apellido = ObtenerTeclado.dameCadena("Introduce el Apellido: ");
            String dni = ObtenerTeclado.dameCadena("Introduce el Dni: ");
            String direccion = ObtenerTeclado.dameCadena("Introduce la Direccion: ");
            String correo = ObtenerTeclado.dameCadena("Introduce el Correo: ");
            String tlf = ObtenerTeclado.dameCadena("Introduce el nº de Telefono: ");
            String apodo = ObtenerTeclado.dameCadena("Introduce el Nombre de Usuario: ");
            int pin = ObtenerTeclado.dameEntero("Introduce el Pin del Cliente");

            /*
             *Se busca el Cliente en la Base de Datos, si está cancela la operacion. Se comprueba que sea unico el Dni, el Nombre de Usuario
             * y el Pin. Si alguno de estos se repite se Cancela la Operación.
             */
            Cliente c = new Cliente(nombre, apellido, dni, direccion, correo, tlf, apodo, pin);
            if (PersistenciaCliente.existeCliente(c) != 0) {
                if (PersistenciaCliente.existeCliente(c) == 1) {
                    System.out.println("Error!! Ya existe un Cliente con ese Dni en la Base de Datos. Operación Cancelada!");
                }
                if (PersistenciaCliente.existeCliente(c) == 2) {
                    System.out.println("Error!! Ya existe un Cliente con ese Nombre de Usuario en la Base de Datos. Operación Cancelada!");
                }
                if(PersistenciaCliente.existeCliente(c)==3){
                    System.out.println("Error!! Ya existe un Cliente con esos Datos. Operación Cancelada!");
                }

                k = ObtenerTeclado.dameEntero("Quieres volver a introducir un nuevo Cliente?? Si(1)/No(0)");
            } else {
                PersistenciaCliente.crearCliente(c);
                System.out.println("Cliente Creado Correctamente!");
                k = 0;
            }
        } while (k != 0);
    }

    /*
     * bajaCliente dá de baja un Cliente de la base de datos. Llama al método buscaClientes para preguntar por el cliente que se
     * quiere borrar, despues confirma y lo da de baja de la base de datos
     */
    public static void bajaCliente(Cliente c) {
        int i=PersistenciaCliente.eliminarCliente(c);
        if(i>0){
            System.out.println("Cliente dado de Baja Correctamente!");
        }else{
            if(PersistenciaCliente.existeCliente(c)>0){
                System.out.println("Error: El Cliente NO ha sido dado de Baja!");
            }else{
                System.out.println("Error: Ha ocurrido un Error Indeterminado en la Persistencia de Datos! Compruebelos!!!");
            }
        }
    }

    /*
     * Devuelve un Cliente por el NombreUsuario y Pin
     */
    public static Cliente obtenerCliente(String nomusuario, int pin) {
        Cliente c = PersistenciaCliente.obtenerCliente(nomusuario, pin);
        return c;
    }
}
